package Game;

import java.util.*;

public class PokerGame02 {
    //牌盒
    //♥3 ♣3
    //键是序号，牌是值
    //此时只要把牌跟序号产生对应关系即可，不需要按照序号进行排序，所以只需HashMap即可
    static HashMap<Integer, String> hm = new HashMap<>();

    //用来存储序号的单列集合
    static ArrayList<Integer> list = new ArrayList<>();

    //静态代码块
    //特点：随着类的加载而在加载的，而且只执行一次。
    static {
        //准备牌
        // "♦", "♣", "♥", "♠"
        // "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"
        String[] color = {"♦", "♣", "♥", "♠"};
        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
/*
        {1=♦3, 2=♦4, 3=♦5, 4=♦6, 5=♦7, 6=♦8, 7=♦9, 8=♦10, 9=♦J, 10=♦Q, 11=♦K, 12=♦A, 13=♦2, 14=♣3,
        15=♣4, 16=♣5, 17=♣6, 18=♣7, 19=♣8, 20=♣9, 21=♣10, 22=♣J, 23=♣Q, 24=♣K, 25=♣A, 26=♣2, 27=♥3,
         28=♥4, 29=♥5, 30=♥6, 31=♥7, 32=♥8, 33=♥9, 34=♥10, 35=♥J, 36=♥Q, 37=♥K, 38=♥A, 39=♥2, 40=♠3,
         41=♠4, 42=♠5, 43=♠6, 44=♠7, 45=♠8, 46=♠9, 47=♠10, 48=♠J, 49=♠Q, 50=♠K, 51=♠A, 52=♠2}
         很明显可以看出没有按照顺序起好牌 应该先把数字一样的放在一起，而不是把花色一样的放在一起
         解决： 交换color和number即可
*/
        //定义一个序号
        int num = 1;

        for (String n : number) {
            //n表示每一种牌号
            for (String c : color) {
                //c表示每一个牌的花色
                hm.put(num, c + n);
                list.add(num);
                num++;
            }
        }
        hm.put(num, "小王");
        list.add(num);
        num++;
        hm.put(num, "大王");
        list.add(num);
    }

    public PokerGame02() {
        // 洗牌
        Collections.shuffle(list);
        // 发牌
        /*
[39, 35, 7]
[28, 31, 15, 54, 14, 24, 3, 46, 43, 22, 37, 41, 29, 45, 16, 30, 48]
[33, 49, 11, 13, 38, 27, 25, 50, 20, 9, 1, 32, 19, 10, 44, 21, 40]
[53, 8, 34, 36, 17, 42, 5, 18, 2, 23, 12, 26, 4, 47, 6, 51, 52]
用ArrayList集合存储的索引是乱序的，我们本质是要根据序号也就是索引去到map集合里面找到牌，所以序号要有序
 */
        /*
        [5, 10, 34]
        [2, 4, 7, 8, 13, 17, 18, 19, 20, 22, 27, 35, 37, 38, 39, 40, 42]
        [1, 9, 14, 16, 23, 24, 28, 29, 30, 31, 32, 36, 41, 43, 46, 51, 52]
        [3, 6, 11, 12, 15, 21, 25, 26, 33, 44, 45, 47, 48, 49, 50, 53, 54]
         */
        //定义4个集合，其中3个选手的牌,还要一个是用来存储地主多出来的3张牌
        TreeSet<Integer> dizhu = new TreeSet<>();
        TreeSet<Integer> player1 = new TreeSet<>();
        TreeSet<Integer> player2 = new TreeSet<>();
        TreeSet<Integer> player3 = new TreeSet<>();


        //获取所有的键，把这些键放入单列集合当中
        // Set<Integer> integers1 = hm.keySet();

        for (int i = 0; i < list.size(); i++) {
            //根据索引找到牌的序号，本质是要把前三张牌的序号给地主
            int number = list.get(i);  //得到了第i张牌的序号
            if (i <= 2) {
                dizhu.add(number); //前三张牌的序号给地主
                // integers1.add(poke);
                //依次轮流给3个选手发牌
            } else if (i % 3 == 0) {
                player1.add(number);
            } else if (i % 3 == 1) {
                player2.add(number);
            } else {
                player3.add(number);
            }

        }


        //看牌
        lookpoke("底牌",dizhu);
        lookpoke("张三",player1);
        lookpoke("李四",player2);
        lookpoke("王五",player3);


        // look("赵六",integers1);
    }


    /*
     * 参数一：玩家的名字
     * 参数二：牌的序号
     * */
    public void lookpoke(String name, TreeSet<Integer> ts) {
        System.out.print(name + ": ");
        for (int num : ts) {
            //num就是代表的是序号，遍历方法1 通过键找值的方式遍历map集合

            //遍历TreeSet集合得到每一个序号，再拿着序号到Map集合中去找真正的牌
            String poke = hm.get(num);//通过键（序号）拿到了每一张牌（值）
            System.out.print(poke + " ");
        }
        System.out.println();

    }

    //遍历单列集合，得到每一个键;
   /* public void look(String name, Set<Integer> key) {
        System.out.print(name+": ");
        //遍历单列集合，得到每一个键
        for (int num : key) {
            //num代表就是序号
            //通过序号（键）去找到map集合里面的值
            String value = hm.get(num);
            System.out.print(value+" ");

        }
        System.out.println();

    }*/
}
